#!/bin/bash

grupo=`pwd`
logFileDir=${grupo}/conf/
logName=instula.log
logFilePath=${logFileDir}${logName}
config_file=${grupo}/conf/Instula.conf
datetime=`date +"%Y-%m-%d %H:%M:%S"`

#Escribe la cadena pasada en el log de instalacion y la muestra por pantalla
function logAndDisplay() {	
	echo "$@"
    echo "$@" >> "$logFilePath"
}

function logMsg() {
    echo "$@" >> "$logFilePath"
}

# Renombra el archivo de log anterior (si ya existe)
saveRenamedFile(){
	regex="^$logName\.[0-9][0-9][0-9]$"
	indexDuplicated="`ls -a "$logFileDir" | grep \"$regex\" | wc -w`"
	indexDuplicated="`printf \"%03d\" $indexDuplicated`"
	logFileRenamed="${logFileDir}${logName}.${indexDuplicated}"
    mv $logFilePath $logFileRenamed   
}

# Crea el log de instalación y lo inicializa
initializeLog(){
	logMessage="Inicio de Instalación"
	echo $logMessage > $logFilePath
}

# Tareas de cierre
end() {
    exit 1
}

# wrapper de trato de archivos y directorios
function makeDirAndLog() {
    newDir=$1
    mkdir $newDir >> "/dev/null" 2>> "/dev/null"
    if [ $? -ne 0 ]; then
        logAndDisplay "No se pudo crear el directorio: $newDir"
        end
    fi     
}

function copyPathAndLog() {
    origPath=$1
    destPath=$2
    cp $origPath $destPath >> "/dev/null" 2>> "/dev/null"
    if [ $? -ne 0 ]; then
        logAndDisplay "No se pudo copiar:$origPath en:$destPath"
        end
    fi 
}

function permissionsForPath() {
    permission=$1
    path=$2
    
    chmod $permission $path >> "/dev/null" 2>> "/dev/null"
    if [ $? -ne 0 ]; then
        logAndDisplay "No se pudieron dar permisos: $permission en ruta: $path"
        end
    fi     
}

#Funcion de terminos y condiciones
termsAndConditions(){
	logAndDisplay "**************************************************************"
	logAndDisplay "* Proceso de Instalación del sistema Postulantes             *"
	logAndDisplay "*          Copyright TPSistemasOp (c)2011                    *"
	logAndDisplay "**************************************************************"
	logAndDisplay "* Al instalar POSTULA UD. expresa estar en un todo de acuerdo*"
	logAndDisplay "* con los términos y condiciones del 'ACUERDO DE LICENCIA DE *"
	logAndDisplay "* SOFTWARE' incluido en este paquete.                        *" 
	logAndDisplay "**************************************************************"
	logAndDisplay "Aceptar [si/no]"	
	read accept
    logMsg $accept
	if [ "$accept" = "no" ]
	then
		exit 1
	else
		if [ "$accept" != "si" ]	
		then
			termsAndConditions	
		fi
	fi
}

# Chequea si perl >= 5 está instalado
checkPerl() {
    errorMsg=""
    perlVersion=`perl -v | awk '/^This/ {print $4}' | sed -e 's/v//'`
    if [[ "$perlVersion" < "5" ]]
    then
        errorMsg="${errorMsg}**************************************************************\r\n"
        errorMsg="${errorMsg}* Para instalar POSTULA es necesario contar previamente con  *\r\n"
        errorMsg="${errorMsg}* Perl 5 o superior instalado.                               *\r\n"
        errorMsg="${errorMsg}* Efectúe su instalación e inténtelo nuevamente              *\r\n"
        errorMsg="${errorMsg}**************************************************************\r\n"
        errorMsg="${errorMsg}Proceso de Instalación Cancelado\r\n"
        logAndDisplay $errorMsg
        end
    fi  
}

showInfoMessages(){
    logAndDisplay "Todos los directorios del sistema de postulantes serán subdirectorios de $grupo"
    logAndDisplay "Todos los componentes de la instalación se obtendrán del repositorio: $grupo/inst"
    for component in `ls $grupo/inst`; do
        logAndDisplay $component
    done
    logAndDisplay "El archivo de configuración y el log de la instalación se registrarán en: $grupo/conf"
}

# Pedido del directorio de bin
setUpBinDirectory(){

	if [[ "$BINDIR" == "" ]]
    then
        BINDIR=${grupo}/bin
    fi
    
	logAndDisplay "Ingrese el nombre del subdirectorio de ejecutables: (${BINDIR})"
	read var1
    logMsg $var1
	if [ "$var1" == "" ];
	then
		# default es el directorio raiz + /bin
		BINDIR="${grupo}/bin"
	else
		# al directorio raiz le sumo donde el usuario quiere guardar
		BINDIR=${grupo}/${var1}
	fi

	# genero la variable de entorno
	export BINDIR

}

setUpArrivalDirectory(){

	if [[ "$ARRIDIR" == "" ]]
    then
        ARRIDIR=${grupo}/arribos
    fi
  
	logAndDisplay "Ingrese el nombre del directorio que permite el arribo de archivos externos (${ARRIDIR})"
	read user_arridir
    logMsg $user_arridir
	if [ "$user_arridir" != "" ];
	then
		ARRIDIR=${grupo}/${user_arridir}
	fi
}

verifyDiskSpace(){
	directory_to_check=${grupo}	
	available_space="`df -k $directory_to_check | tail -1 | sed 's/\t/ /g' | awk '{print $4}'`"
	
	let limit_kb=DATASIZE*1024	
	if [ "$available_space" -lt "$limit_kb" ]; then
        
		logAndDisplay "ERROR !:
         Insuficiente espacio en disco.
         Espacio disponible en $ARRIDIR <$available_space>. 
         Espacio requerido $limit_kb"
		setUpMaxFileSize

	fi
}

setUpMaxFileSize(){
	DATASIZE=200
	logAndDisplay "Ingrese el espacio mínimo requerido para datos externos (en Mbytes): $DATASIZE Mb"
	read selected_data_size
    logMsg $selected_data_size
	if [ "$selected_data_size" != "" ]; then
		DATASIZE=$selected_data_size
	fi
	verifyDiskSpace
}

setUpLogDirectory(){
    if [[ "$LOGDIR" == "" ]]
    then
        LOGDIR="${grupo}/log"
    fi

	logAndDisplay "Ingrese el nombre del directorio de log: ($LOGDIR)"
	read DIR
    logMsg $DIR
	if [[ "$DIR" != "" ]]; then
		# al directorio raiz le sumo donde el usuario quiere guardar
		LOGDIR=${grupo}/${DIR}
	fi

	# genero la variable de entorno
	export LOGDIR
}

setUpLogExt(){
    if [[ "$LOGEXT" == "" ]]
    then
        LOGEXT=".log"
    fi

	logAndDisplay "Ingrese la extensión para los archivos de log: ($LOGEXT)"
	read input_data
    logMsg $input_data
	if [[ "$input_data" != "" ]];
	then
		LOGEXT=$input_data
	fi

    # genero la variable de entorno
	export LOGEXT
}

setUpLogSize(){
	if [[ "$LOGSIZE" == "" ]]
    then
        LOGSIZE=500
    fi

	logAndDisplay "Ingrese el espacio máximo para los archivos $LOGEXT (en Kbytes): $LOGSIZE KB"
	read input_data
    logMsg $input_data
	if [[ "$input_data" != "" ]];
	then
		LOGSIZE=$input_data
	fi

    # genero la variable de entorno
	export LOGSIZE
}

#Limpia la pantalla y muestra todas las opciones seleccionadas solicitando
#confirmación.
showSelectedSettings(){
    clear
    logAndDisplay "***********************************************************************"
    logAndDisplay "* Parámetros de Instalación del paquete POSTULA                       *"
    logAndDisplay "***********************************************************************"
    logAndDisplay "Directorio de trabajo: $grupo"
    logAndDisplay "Directorio de instalación: $grupo/inst"
    logAndDisplay "Directorio de configuración: $grupo/conf"
    logAndDisplay "Directorio de datos: $grupo/data"
    logAndDisplay "Librería de ejecutables: $BINDIR"
    logAndDisplay "Directorio de arribos: $ARRIDIR"
    logAndDisplay "Espacio mínimo reservado en $ARRIDIR: $DATASIZE Mb"
    logAndDisplay "Directorio para los archivos de Log: $LOGDIR"
    logAndDisplay "Extensión para los archivos de Log: $LOGEXT"
    logAndDisplay "Tamaño máximo para cada archivo de Log: $LOGSIZE Kb"
    logAndDisplay "Log de la instalación: $grupo/conf/Instula.log"

    logAndDisplay "Si los datos ingresados son correctos oprima solo ENTER para iniciar la"
    logAndDisplay "instalación. Si desea modificar alguno de ellos oprima cualquier tecla"
    logAndDisplay "************************************************************************"

    read -n1 input_data
    logMsg $input_data
	if [[ "$input_data" != "" ]];
	then
		return 1
	fi
    return 0
}

showConfirmationMessage(){
    logAndDisplay "Iniciando Instalación... Está UD. seguro? (Si/No)"

    read input_data
    logMsg $input_data
    if [[ "$input_data" != "Si" ]]; then
        if [[ "$input_data" != "si" ]]; then
            if [[ "$input_data" != "s" ]]; then
                if [[ "$input_data" != "S" ]]; then
                    end
                fi
            fi
        fi
    fi
}

createDirs(){
    logAndDisplay "Creando Estructuras de Directorio......."

    makeDirAndLog "$BINDIR"
    permissionsForPath gu+r "$BINDIR"
    
    makeDirAndLog "$ARRIDIR"
    permissionsForPath gu+rw "$ARRIDIR"
    makeDirAndLog "$LOGDIR"
    permissionsForPath gu+rw "$LOGDIR"
    makeDirAndLog "$grupo/recibidos"
    permissionsForPath gu+rw "$grupo/recibidos"
    makeDirAndLog "$grupo/rechazados"
    permissionsForPath gu+rw "$grupo/rechazados"
    makeDirAndLog "$grupo/procesados"
    permissionsForPath gu+rw "$grupo/procesados"

    makeDirAndLog "$grupo/nuevos"
    permissionsForPath gu+rw "$grupo/nuevos"
    makeDirAndLog "$grupo/list"
    permissionsForPath gu+rw "$grupo/list"
}

doInstall(){
    #Creamos el archivo de configuración si no existe
    touch $config_file

    #Agregamos cuantas lineas esten faltando para llegar a 24
    lines_count=`cat "$config_file" | grep -c ""`
    lines_to_add=`expr 24 - $lines_count`
    for (( i=0; i<$lines_to_add; i++ ));
    do
        echo "" >> $config_file
    done
    
    cur_date=`date +%Y-%m-%d`
    logAndDisplay "Moviendo Archivos..."

    copyPathAndLog "$grupo/inst/mover.sh" "$BINDIR"
    permissionsForPath gu+x "$BINDIR/mover.sh"
    copyPathAndLog "$grupo/inst/gralog.sh" "$BINDIR"
    permissionsForPath gu+x "$BINDIR/gralog.sh"

    copyPathAndLog "$grupo/inst/postini.sh" "$BINDIR"
    permissionsForPath gu+x "$BINDIR/postini.sh"
    sed -i "s|%%GRUPO%%|$grupo|" "$BINDIR/postini.sh"
    POSTINI_DATE=$cur_date
    sed -i "21s/.*/$cur_date/" "$config_file"
    logAndDisplay "    Instalación del componente POSTINI completada"

    copyPathAndLog "$grupo/inst/postonio.sh" "$BINDIR"
    permissionsForPath gu+x "$BINDIR/postonio.sh"
    POSTONIO_DATE=$cur_date
    sed -i "22s/.*/$cur_date/" "$config_file"
    logAndDisplay "    Instalación del componente POSTONIO completada"

    copyPathAndLog "$grupo/inst/postular.sh" "$BINDIR"
    permissionsForPath gu+x "$BINDIR/postular.sh"
    PLIST_DATE=$cur_date
    sed -i "23s/.*/$cur_date/" "$config_file"
    logAndDisplay "    Instalación del componente POSTULAR completada"

    copyPathAndLog "$grupo/inst/plist.pl" "$BINDIR"
    sed -i "s|%%GRUPO%%|$grupo|" "$BINDIR/plist.pl"
    makeDirAndLog "$BINDIR/plist_utils"
    permissionsForPath gu+rw "$BINDIR/plist_utils"
    copyPathAndLog "$grupo/inst/plist_utils/*" "$BINDIR/plist_utils/"
    permissionsForPath gu+x "$BINDIR/plist.pl"
    POSTULAR_DATE=$cur_date
    sed -i "24s/.*/$cur_date/" "$config_file"
    logAndDisplay "    Instalación del componente PLIST.PL completada"
}

deleteTemporaryFiles(){
    echo "delete temporary files" >> "/dev/null" 2>> "/dev/null"
}

showInitialInformation(){
    if [[ "$POSTINI_DATE" != "" || "$POSTONIO_DATE" != "" || "$PLIST_DATE" != "" || "$POSTULAR_DATE" != "" ]]
    then
        logAndDisplay "********************************************************"
        logAndDisplay "*   Proceso de Instalación del sistema de Postulantes  *"
        logAndDisplay "*            Copyright TPSistemasOp (c)2011            *"
        logAndDisplay "********************************************************"
        showInstallationInfo
        logAndDisplay "Proceso de Instalación Cancelado"
        end
    fi
}

showInstalledComponents(){
    user=`whoami`
    cur_date=`date +%Y-%m-%d`

    if [[ "$POSTINI_DATE" != "" ]]
    then
        logAndDisplay " POSTINI  $cur_date             $user     "
    fi

    if [[ "$POSTONIO_DATE" != "" ]]
    then
        logAndDisplay " POSTONIO $cur_date             $user     "
    fi

    if [[ "$PLIST_DATE" != "" ]]
    then
        logAndDisplay " POSTLIST $cur_date             $user     "
    fi

    if [[ "$POSTULAR_DATE" != "" ]]
    then
        logAndDisplay " POSTULAR $cur_date             $user     "
    fi
}

showNotInstalledComponents(){
    if [[ "$POSTINI_DATE" == "" ]]
    then
        logAndDisplay " POSTINI          "
    fi

    if [[ "$POSTONIO_DATE" == "" ]]
    then
        logAndDisplay " POSTONIO         "
    fi

    if [[ "$PLIST_DATE" == "" ]]
    then
        logAndDisplay " POSTLIST         "
    fi

    if [[ "$POSTULAR_DATE" == "" ]]
    then
        logAndDisplay " POSTULAR         "
    fi
}

showInstallationInfo(){
    logAndDisplay "**************************************************************"
    if [[ "$POSTINI_DATE" != "" || "$POSTONIO_DATE" != "" || "$PLIST_DATE" != "" || "$POSTULAR_DATE" != "" ]]
    then
        logAndDisplay "* Se encuentran instalados los siguientes componentes:       *" 
        showInstalledComponents
    fi
    if [[ "$POSTINI_DATE" == "" || "$POSTONIO_DATE" == "" || "$PLIST_DATE" == "" || "$POSTULAR_DATE" == "" ]]
    then
        logAndDisplay "* Falta instalar los siguientes componentes:              " 
        showNotInstalledComponents
        logAndDisplay "* Elimine los componentes instalados e inténtelo nuevamente."
    fi
    logAndDisplay "**************************************************************"
}

showFinalInformation(){
    showInstallationInfo

    logAndDisplay "* FIN del Proceso de Instalación de Postulantes              *"
    logAndDisplay "*          Copyright TPSistemasOp (c)2011                    *"
    logAndDisplay "**************************************************************"
    logAndDisplay "Presione ENTER para salir"

    read input_data    
    logMsg $input_data
}

saveConfiguration(){
    tail -n +11 "$config_file" > "$grupo/.temp"
	echo "CURRDIR = $grupo" > $config_file	
 	echo "CONFDIR = $grupo/conf"  >> "$config_file"
	echo "ARRIDIR = $ARRIDIR"  >> "$config_file"
	echo "BINDIR = $BINDIR"  >> "$config_file"
	echo "DATASIZE = $DATASIZE Mb"  >> "$config_file"
	echo "LOGDIR = $LOGDIR"  >> "$config_file"
	echo "LOGEXT = $LOGEXT"  >> "$config_file"
	echo "MAXLOGSIZE = $LOGSIZE Kb"  >> "$config_file"
	echo "USERID = $USER"  >> "$config_file"
	echo "FECINS = $datetime"  >> "$config_file"
    cat "$grupo/.temp" >> "$config_file"
    rm -f "$grupo/.temp"
}

loadInstallationDates(){
    if [ -f "$config_file" ]; then  
        POSTINI_DATE=`sed "21p" "$config_file"` >> "/dev/null" 2>> "/dev/null"
        POSTONIO_DATE=`sed "22p" "$config_file"` >> "/dev/null" 2>> "/dev/null"
        POSTULAR_DATE=`sed "23p" "$config_file"` >> "/dev/null" 2>> "/dev/null"
        PLIST_DATE=`sed "24p" "$config_file"` >> "/dev/null" 2>> "/dev/null"
    fi
}

##### MAIN #####
if [ -f $logFilePath ]
then
	saveRenamedFile	
fi
initializeLog
loadInstallationDates
showInitialInformation
termsAndConditions
checkPerl

confirmation=1
while [ $confirmation -ne 0 ]
do
    showInfoMessages
    setUpBinDirectory
    setUpArrivalDirectory
    setUpMaxFileSize
    setUpLogDirectory
    setUpLogExt
    setUpLogSize
    showSelectedSettings
    confirmation=$?
done

showConfirmationMessage
createDirs
doInstall
saveConfiguration
deleteTemporaryFiles
showFinalInformation

end
